package com.playball.lottery.util;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

/**
 * 
 * 一个检测手机摇晃的监听器
 * 
 */
public class SensorListener implements SensorEventListener {
    // 速度阈值，当摇晃速度达到这值后产生作用
    private static final int SPEED_SHRESHOLD = 4000;
    // 两次检测的时间间隔
    private static final int UPTATE_INTERVAL_TIME = 70;
    // 传感器管理器
    private SensorManager sensorManager;
    // 传感器
    private Sensor sensor;
    // 重力感应监听器
    private OnSensorListener onSensorListener;
    // 上下文
    private Context context;
    // 手机上一个位置时重力感应坐标
    private float lastX;
    private float lastY;
    private float lastZ;

    // 上次检测时间
    private long lastUpdateTime;

    // 构造器
    public SensorListener(Context c) {
	// 获得监听对象
	context = c;
	start();
    }

    // 开始
    public void start() {
	// 获得传感器管理器
	sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
	if (sensorManager != null) {
	    // 获得重力传感器
	    sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
	}
	// 注册
	if (sensor != null) {
	    sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);
	}

    }

    // 停止检测
    public void stop() {
	sensorManager.unregisterListener(this);
    }

    // 摇晃监听接口
    public interface OnSensorListener {
	public void onShake();
    }

    // 设置重力感应监听器
    public void setOnSensorListener(OnSensorListener listener) {
	onSensorListener = listener;
    }

    // 重力感应器感应获得变化数据
    public void onSensorChanged(SensorEvent event) {
	// 现在检测时间
	long currentUpdateTime = System.currentTimeMillis();
	// 两次检测的时间间隔
	long timeInterval = currentUpdateTime - lastUpdateTime;
	// 判断是否达到了检测时间间隔
	if (timeInterval < UPTATE_INTERVAL_TIME)
	    return;
	// 现在的时间变成last时间
	lastUpdateTime = currentUpdateTime;

	// 获得x,y,z坐标
	float x = event.values[0];
	float y = event.values[1];
	float z = event.values[2];

	// 获得x,y,z的变化值
	float deltaX = x - lastX;
	float deltaY = y - lastY;
	float deltaZ = z - lastZ;

	// 将现在的坐标变成last坐标
	lastX = x;
	lastY = y;
	lastZ = z;

	double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / timeInterval * 10000;
	// 达到速度阀值，发出提示
	if (speed >= SPEED_SHRESHOLD)
	    onSensorListener.onShake();
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}
    // ----------------------------------------------------------------------------------------------------------------------------------------------------------
    // 晃动
    // public void huangdong() {
    // // progressBar1 = (ProgressBar) findViewById(R.id.progressBar1);
    // // progressBar1.setMax(100);
    //
    // // 通过服务得到传感器管理对象，实例化系统的传感器服务
    // sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    // // 使用默认传感器-加速度类型
    // int sensorType = Sensor.TYPE_ACCELEROMETER;
    // acceleromererSensor = sm.getDefaultSensor(sensorType);
    // // 3个参数的意思：侦听器对象，注册传感器，
    // sm.registerListener(mySensorEventListener, acceleromererSensor,
    // SensorManager.SENSOR_DELAY_NORMAL);
    // }
    //
    // // 晃动监听
    // public final SensorEventListener mySensorEventListener = new
    // SensorEventListener() {
    //
    // @Override
    // public void onSensorChanged(SensorEvent event) {
    // // TODO Auto-generated method stub
    // if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    //
    // // 获取加速度传感器的三个参数
    // float x = event.values[SensorManager.DATA_X];
    // float y = event.values[SensorManager.DATA_Y];
    // float z = event.values[SensorManager.DATA_Z];
    // // 获取当前时刻的毫秒数
    // curTime = System.currentTimeMillis();
    // // 1000毫秒检测一次
    // if ((curTime - lastTime) > 1000) {
    // long diffTime = (curTime - lastUpdate);
    // lastUpdate = curTime;
    // float speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime *
    // 10000;
    // if (speed > SHAKE_THRESHOLD) {
    // Log.d("sensor", "shake detected w/ speed: " + speed);
    // SoundManage.OnVibator(SsqxhActivity.this, 100L);
    // // new SoundManage().OnPlaySoundPool(SsqxhActivity.this,
    // // "audio.wav");
    // Random(6, 1);
    // }
    // last_x = x;
    // last_y = y;
    // last_z = z;
    // }
    // }
    // }
    //
    // @Override
    // public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // // TODO Auto-generated method stub
    // }
    //
    // };
